/* Error routines for programs that can run as a daemon. */
#include <errno.h>
#include <stdarg.h>
#include <syslog.h>
#include "ourhdr.h"

static void log_doit(int, int, const char *, va_list ap);

extern int debug;   /* caller must define and set this: 
                       nonzero if interactive, zero of daemon  */

/* Initialize syslog(), if running as daemon. */
void log_open(const char * ident, int option, int facility) {
    if (debug == 0)
        openlog(ident, option, facility);
}

void log_ret(const char * fmt, ...) {
    va_list ap;
    va_start(ap, fmt);
    log_doit(1, LOG_ERR, fmt, ap);
    va_end(ap);
    return;
}

void log_sys(const char * fmt, ...) {
    va_list ap;
    va_start(ap, fmt);
    log_doit(1, LOG_ERR, fmt, ap);
    va_end(ap);
    exit(2);
}

void log_msg(const char * fmt, ...) {
    va_list ap;
    va_start(ap, fmt);
    log_doit(0, LOG_ERR, fmt, ap);
    va_end(ap);
    return;
}

void log_quit(const char * fmt, ...) {
    va_list ap;
    va_start(ap, fmt);
    log_doit(0, LOG_ERR, fmt, ap);
    va_end(ap);
    exit(2);
}

static void log_doit(int errnoflag, int priority, const char * fmt, va_list ap)
{
    int errno_save;
    char buf[MAXLINE];
    errno_save= errno;  /* value caller might want printed */
    vsprintf(buf, fmt, ap);
    if (errnoflag)
        sprintf(buf + strlen(buf), ": %s", strerror(errno_save));
    strcat(buf, "\n");
    if (debug) {
        fflush(stdout);
        fputs(buf, stderr);
        fflush(stderr);
    } else 
        syslog(priority, buf);
    return;
}


